<?php

namespace App\exption\push\Xmpush;

use App\exption\push\Xmpush\src\Builder;
use App\interf\Push;

use App\exption\push\Xmpush\src\HttpBase;
use App\exption\push\Xmpush\src\Sender;
use App\exption\push\Xmpush\src\Constants;
use App\exption\push\Xmpush\src\Stats;
use App\exption\push\Xmpush\src\Tracer;
use App\exption\push\Xmpush\src\Feedback;
use App\exption\push\Xmpush\src\DevTools;
use App\exption\push\Xmpush\src\Subscription;
use App\exption\push\Xmpush\src\TargetedMessage;

/*华为推送*/
class Xmpush implements Push
{

    const GETACCESSTOKENURL = 'https://login.vmall.com/oauth2/token';
    const PUSHMESSAGEURL = 'https://api.push.hicloud.com/pushsend.do';

    protected $accessToken=null;
    protected $app_secret;
    protected $appPkgName='com.xianghe.ivy';
    protected $mobile_type;
    public function __construct()
    {
        $this->app_secret = config('push')['xmpush']['app_secret'];
    }

    /*
     * 单个推送
     * param array $params = [
     * 'title'=>必填
     * 'content'=>必填
     * 'description'=>必填
     * 'mobile_list'=>必填
     * 'bi_tag'=>'n'
     * 'icon'=>'n']  // 消息内容参数
     * param array $mobile_list       移动设备号列表   * 单个推送
     * */
    public function singlePush($params)
    {
        if( !is_array($params) || !array_key_exists('title', $params) || !array_key_exists('content', $params) || !array_key_exists('description', $params) ||
            !array_key_exists('mobile_list', $params) )
            return ['status'=>'error', 'message_code'=>10128, 'message'=>'参数异常', 'data'=>$params];
        if(is_array($params['mobile_list']))
            return ['status'=>'error', 'message_code'=>10134, 'message'=>'请选择批量推送', 'data'=>$params];

        // 0 表示通知栏消息1 表示透传消息Stringtitle通知栏展示的通知的标题
        $passThrough = ($params['msg_type'] == 1) ? $params['msg_type'] : 0;
        $mobile_list = $params['mobile_list'];
        // 可选项。默认情况下，通知栏只显示一条推送消息。如果通知栏要显示多条推送消息，需要针对不同的消息设置不同的notify_id（相同notify_id的通知栏消息会覆盖之前的
        $notifyId = isset($params['notify_id']) ? $params['notify_id'] : '2';

        // app 业务内容
        $temp_arr = [];
        $temp_arr['type'] = (int)$notifyId;
        $temp_arr['content'] = $params['content'];
        if(isset($params['extend']) && !empty($params['extend']))
            foreach ($params['extend'] as $key=>$value)
                $temp_arr[$key] = $value;
        $payload = json_encode($temp_arr);

        // 常量设置必须在new Sender()方法之前调用   设置app 包名；备注：V2版本支持一个包名，V3版本支持多包名（中间用逗号分割）
        Constants::setPackage($this->appPkgName);
        // 设置secret
        Constants::setSecret($this->app_secret);

        $message = new Builder();
        // 透传去掉 title 和 description
        if($passThrough != 1){
            $message->title($params['title']);                                      // 通知栏的title
            $message->description($params['description']);                  // 通知栏的descption
        }
        // 0 表示通知栏消息 1 表示透传消息Stringtitle通知栏展示的通知的标题
        $message->passThrough($passThrough);
        $message->payload($payload);                        // 携带的数据，点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
        $message->extra(Builder::notifyForeground, 0);      // 可选项，开启/关闭app在前台时的通知弹出 1:弹出通知  0 不弹出
        $message->notifyId($notifyId);
        $message->build();

        // 推送消息
        $sender = new Sender();
        $response = $sender->sendToAliases($message, [$mobile_list])->getRaw();

        // 推送成功
        if(isset($response['code']) && $response['code'] == '0' && strtoupper($response['result']) == 'OK')
            return ['status'=>'success', 'message_code'=>10130, 'message'=>'推送成功', 'errorCode'=>'0', 'push_response'=>$response];
        return ['status'=>'error', 'message_code'=>10131, 'message'=>$response['description'] ?? '推送消息异常', 'errorCode'=>$response['code'] ?? '未知状态码', 'push_response'=>$response];
    }

    /*
     * 批量推送
     * param array $params = [
     * 'title'=>必填
     * 'content'=>必填
     * 'description'=>必填
     * 'mobile_list'=>必填
     * 'bi_tag'=>'n'
     * 'icon'=>'n']  // 消息内容参数
     * param array $mobile_list       移动设备号列表
     * */
    public function batchPush($params)
    {
        if( !is_array($params) || !array_key_exists('title', $params) || !array_key_exists('content', $params) || !array_key_exists('description', $params) ||
            !array_key_exists('mobile_list', $params) || !is_array($params['mobile_list']))
            return ['status'=>'error', 'message_code'=>10128, 'message'=>'参数异常', 'data'=>$params];

        // 0 表示通知栏消息1 表示透传消息Stringtitle通知栏展示的通知的标题
        $passThrough = ($params['msg_type'] == 1) ? $params['msg_type']:0;
        $mobile_list = $params['mobile_list'];
        // 可选项，开启/关闭app在前台时的通知弹出 1:弹出通知  0 不弹出
        $notifyForeground = isset($notifyForeground['notify_foreground']) ? $notifyForeground['notify_foreground'] : '0';
        // 可选项。默认情况下，通知栏只显示一条推送消息。如果通知栏要显示多条推送消息，需要针对不同的消息设置不同的notify_id（相同notify_id的通知栏消息会覆盖之前的
        $notifyId = isset($notifyForeground['notify_id']) ? $notifyForeground['notify_id'] : '2';

        // 可以自定义扩展吗？
        $payload = '{"test":1,"ok":"It\'s a string"}';

        // 常量设置必须在new Sender()方法之前调用   设置app 包名；备注：V2版本支持一个包名，V3版本支持多包名（中间用逗号分割）
        Constants::setPackage($this->appPkgName);
        // 设置secret
        Constants::setSecret($this->app_secret);

        if(!empty($params['mobile_list'])){

            foreach ($params['mobile_list'] as $key=>$value){

                // message1 演示自定义的点击行为
                $message = new Builder();
                $message->title($params['title']);
                $message->description($params['description']);                  // 通知栏的descptio
                // 0 表示通知栏消息1 表示透传消息Stringtitle通知栏展示的通知的标题
                $message->passThrough($passThrough);
                $message->payload($payload);// 携带的数据，点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
                // 可选项，开启/关闭app在前台时的通知弹出 1:弹出通知  0 不弹出
                $message->extra(Builder::notifyForeground, 1);
                $message->notifyId($notifyId);
                $message->build();
                $targetMessage = new TargetedMessage();
                $targetMessage->setTarget($value, TargetedMessage::TARGET_TYPE_ALIAS); // 设置发送目标。可通过regID,alias和topic三种方式发送
                $targetMessage->setMessage($message);
                $targetMessageList[] =$targetMessage;
            }
        }

        // 推送消息
        $sender = new Sender();
        $response = $sender->multiSend($targetMessageList,TargetedMessage::TARGET_TYPE_ALIAS)->getRaw();

        // 推送成功
        if(isset($response['code']) && $response['code'] == '0' && strtoupper($response['result']) == 'OK')
            return ['status'=>'success', 'message_code'=>10130, 'message'=>'推送成功', 'errorCode'=>'0', 'push_response'=>$response];

        return ['status'=>'error', 'message_code'=>10131, 'message'=>$response['description'] ?? '推送消息异常', 'errorCode'=>$response['code'] ?? '未知状态码', 'push_response'=>$response];
    }
}

